package com.shockweb.common.utils;

import java.math.BigDecimal;
import java.sql.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import com.shockweb.common.International;

//import org.apache.commons.beanutils.PropertyUtils;
/**
 * 数据格式化工具
 * @author: 彭明华
 * History:
 * 2017年5月19日  彭明华创建
 */
public final class DataFormat
{
	private DataFormat(){
		
	}
	
	/**
	 * 格式化成在html下的javascript变量
	 * @param value 数据
	 * @return String
	 */
    public static final String formatToVarHtml(String value)
    {
        return formatToVar(formatToHtml(value));
    }

    /**
     * 格式化成html
     * @param value 数据
     * @return String
     */
    public static final String formatToHtml(String value)
    {
        if(value == null)
            return "";
        char content[] = new char[value.length()];
        value.getChars(0, value.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        char ac[];
        int j = (ac = content).length;
        for(int i = 0; i < j; i++)
        {
            char c = ac[i];
            switch(c)
            {
            case 60: // '<'
                result.append("&lt;");
                break;

            case 62: // '>'
                result.append("&gt;");
                break;

            case 38: // '&'
                result.append("&amp;");
                break;

            case 34: // '"'
                result.append("&quot;");
                break;

            case 39: // '\''
                result.append("&#39;");
                break;

            default:
                result.append(c);
                break;
            }
        }
        return result.toString();
    }

    /**
     * 格式化成javascript
     * @param value 数据
     * @return String
     */
    public static final String formatToVar(String value)
    {
        if(value == null)
            return "";
        char content[] = new char[value.length()];
        value.getChars(0, value.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        char ac[];
        int j = (ac = content).length;
        for(int i = 0; i < j; i++)
        {
            char c = ac[i];
            switch(c)
            {
            case 92: // '\\'
                result.append("\\\\");
                break;

            case 34: // '"'
                result.append("\\\"");
                break;

            case 39: // '\''
                result.append("\\'");
                break;

            case 13: // '\r'
                result.append("\\n");
                break;

            case 10: // '\n'
                result.append("\\n");
                break;

            default:
                result.append(c);
                break;
            }
        }

        return result.toString();
    }

    /**
     * 格式化任意对象
     * @param value 数据
     * @return String
     */
    public static String format(Object value)
    {
        return format(value, null);
    }

    /**
     * 格式化任意对象
     * @param value 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    public static String format(Object value, String formatOption)
    {
        String rtn = "";
        if(value != null)
            if(value instanceof Integer)
            {
                Integer intValue = (Integer)value;
                rtn = formatLong(new Long(intValue.toString()), formatOption);
            } else
            if(value instanceof Long)
            {
                Long lngValue = (Long)value;
                rtn = formatLong(lngValue, formatOption);
            } else
            if(value instanceof Boolean)
            {
                Boolean blValue = (Boolean)value;
                rtn = formatBoolean(blValue);
            } else
            if(value instanceof String)
            {
                String strValue = (String)value;
                rtn = formatString(strValue);
            } else
            if(value instanceof Double)
            {
                Double dblValue = (Double)value;
                rtn = formatDouble(dblValue, formatOption);
            } else
            if(value instanceof BigDecimal)
            {
                BigDecimal bdlValue = (BigDecimal)value;
                rtn = formatBigDecimal(bdlValue, formatOption);
            } else
            if(value instanceof Float)
            {
                Float fltValue = (Float)value;
                rtn = formatFloat(fltValue, formatOption);
            } else
            if(value instanceof Time)
            {
                Time timValue = (Time)value;
                rtn = formatTime(new Timestamp(timValue.getTime()), formatOption);
            } else
            if(value instanceof Date)
            {
                Date datValue = (Date)value;
                rtn = formatDate(datValue, formatOption);
            } else
            if(value instanceof Timestamp)
            {
                Timestamp tisValue = (Timestamp)value;
                rtn = formatTimestamp(tisValue, formatOption);
            } else
            if(value instanceof java.util.Date)
            {
            	java.util.Date datValue = (java.util.Date)value;
                rtn = formatDate(new Timestamp(datValue.getTime()), formatOption);
            } else
            {
                rtn = value.toString();
            }
        return rtn;
    }

    /**
     * 格式化boolean
     * @param d 数据
     * @return String
     */
    private static String formatBoolean(Boolean d)
    {
        if(d != null)
        {
            if(Boolean.TRUE.equals(d))
                return "\u662F";
            else
                return "\u5426";
        } else
        {
            return "";
        }
    }

    /**
     * 格式化string
     * @param d 数据
     * @return String
     */
    private static String formatString(String d)
    {
        if(d != null)
            return d;
        else
            return "";
    }

    /**
     * 格式化BigDecimal
     * @param d 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatBigDecimal(BigDecimal d, String formatOption)
    {
        String strNumber = "";
        if(d != null)
        {
            if(formatOption == null)
                formatOption = International.OUT_FLOAT;
            DecimalFormat df = new DecimalFormat(formatOption);
            strNumber = df.format(d);
        }
        return strNumber;
    }

    /**
     * 格式化Float
     * @param d 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatFloat(Float d, String formatOption)
    {
        String strNumber = "";
        if(d != null)
        {
            if(formatOption == null)
                formatOption = International.OUT_FLOAT;
            DecimalFormat df = new DecimalFormat(formatOption);
            strNumber = df.format(d);
        }
        return strNumber;
    }

    /**
     * 格式化Double
     * @param d 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatDouble(Double d, String formatOption)
    {
        String strNumber = "";
        if(d != null)
        {
            if(formatOption == null)
                formatOption = International.OUT_FLOAT;
            DecimalFormat df = new DecimalFormat(formatOption);
            strNumber = df.format(d);
        }
        return strNumber;
    }

    /**
     * 格式化Long
     * @param d 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatLong(Long d, String formatOption)
    {
        if(d != null)
        {
            String strNumber = null;
            if(formatOption == null)
                formatOption = International.OUT_INTEGER;
            DecimalFormat df = new DecimalFormat(formatOption);
            strNumber = df.format(d);
            return strNumber;
        } else
        {
            return "";
        }
    }

    /**
     * 格式化Timestamp
     * @param dt 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatTimestamp(Timestamp dt, String formatOption)
    {
        String newDate = "";
        if(dt == null)
            return newDate;
        if(formatOption == null)
            formatOption = International.OUT_DATETIMEMSEL;
        try
        {
            SimpleDateFormat dateStyle = new SimpleDateFormat(formatOption);
            newDate = dateStyle.format(dt);
        }
        catch(Exception exception) { }
        return newDate;
    }

    /**
     * 格式化Timestamp
     * @param dt 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatTime(Timestamp dt, String formatOption)
    {
        String newDate = "";
        if(dt == null)
            return newDate;
        try
        {
            if(formatOption == null)
                formatOption = International.OUT_TIME;
            SimpleDateFormat dateStyle = new SimpleDateFormat(formatOption);
            newDate = dateStyle.format(dt);
        }
        catch(Exception exception) { }
        return newDate;
    }

    /**
     * 格式化Timestamp
     * @param dt 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatDate(Timestamp dt, String formatOption)
    {
        String newDate = "";
        if(dt == null)
            return newDate;
        if(formatOption == null)
            formatOption = International.OUT_DATE;
        try
        {
            SimpleDateFormat dateStyle = new SimpleDateFormat(formatOption);
            newDate = dateStyle.format(dt);
        }
        catch(Exception exception) { }
        return newDate;
    }

    /**
     * 格式化Date
     * @param d 数据
     * @param formatOption 格式化的模板
     * @return String
     */
    private static String formatDate(Date d, String formatOption)
    {
        if(formatOption == null)
            formatOption = International.OUT_DATE;
        SimpleDateFormat dateStyle = new SimpleDateFormat(formatOption);
        return dateStyle.format(d);
    }

    /**
     * 获取当前日期
     * @return String
     */
    public static String getCurrentDate()
    {
        Calendar cld = Calendar.getInstance();
        int year = cld.get(1);
        int month = cld.get(2) + 1;
        int date = cld.get(5);
        return (new StringBuilder(String.valueOf(String.valueOf(year)))).append("-").append(String.valueOf(month)).append("-").append(String.valueOf(date)).toString();
    }

    /**
     * 比较字符串a比b是否相等
     * @param a
     * @param b
     * @return boolean
     */
    public static boolean equals(String a, String b)
    {
        if(a == null)
            return b == null;
        if(b == null)
            return false;
        else
            return a.equals(b);
    }

    /**
     * 替换字符函数
     * @param sb 原字符床
     * @param str 被替换的字符串
     * @param tag 替换的字符串
     * @return String
     */
    public static String replace(StringBuffer sb, String str, String tag)
    {
        if(str != null && tag != null && !str.equals(tag))
            if(sb != null)
            {
                int index = sb.indexOf(str);
                int len = str.length();
                int len2 = tag.length();
                for(; index >= 0; index = sb.indexOf(str, index + len2))
                    sb.replace(index, index + len, tag);

                return sb.toString();
            } else
            {
                return null;
            }
        if(sb != null)
            return sb.toString();
        else
            return null;
    }
//
//    /**
//     * 格式化实例的get方法数据
//     * @param instance 对象实例
//     * @param methodName 方法的名称
//     * @return String
//     */
//    public static String getFormatValue(Object instance, String methodName)
//    {
//        return getFormatValue(instance, methodName, null);
//    }
//
//    /**
//     * 格式化实例的get方法数据
//     * @param instance 对象实例
//     * @param methodName 方法的名称
//     * @param formatOption  格式化的模板
//     * @return String
//     */
//    public static String getFormatValue(Object instance, String methodName, String formatOption)
//    {
//        String rtn = "";
//        if(!isEmptyOrBlank(methodName))
//        {
//            String strs[] = methodName.split(";");
//            if(strs != null)
//            {
//                String as[];
//                int j = (as = strs).length;
//                for(int i = 0; i < j; i++)
//                {
//                    String str = as[i];
//                    Object o = null;
//                    String strs2[] = str.split(",");
//                    String rtn2 = "";
//                    if(strs2 != null)
//                    {
//                        String as1[];
//                        int l = (as1 = strs2).length;
//                        for(int k = 0; k < l; k++)
//                        {
//                            String str2 = as1[k];
//                            try
//                            {
//                                o = PropertyUtils.getProperty(instance, str2);
//                            }
//                            catch(Exception exception) { }
//                            if(rtn2.equals(""))
//                                rtn2 = formatToVar(format(o, formatOption));
//                            else
//                                rtn2 = (new StringBuilder(String.valueOf(rtn2))).append(",").append(formatToVar(format(o, formatOption))).toString();
//                        }
//
//                    }
//                    rtn = (new StringBuilder(String.valueOf(rtn))).append(rtn2).toString();
//                }
//
//            }
//        }
//        return rtn;
//    }

    /**
     * 判断是否为null或"" 
     * @param value 数值
     * @return boolean 如果是返回true，否则返回false
     */
    public static boolean isEmptyOrBlank(String value)
    {
        return value == null || value.trim().equals("");
    }
}